perm filename PATHS.RLS[225,JMC] blob sn#005364 filedate 1971-01-14 generic text, type T, neo UTF8
00100	COMMENT A COLLECTION OF FUNCTIONS FOR COMPUTING PATHS;
00200	
00300	OFF ECHO;
00400	
00500	COMMENT IS THERE A PATH FROM  X  TO  Y  IN THE GRAPH  G  WHERE  SEEN
00600	IS A LIST OF VERTICES ALREADY SEEN?;
00700	ISPATH(X,Y,SEEN,G) ← X EQ Y OR ORLIS(SUBT(CDR ASSOC(X,G),SEEN),
00800		FUNCTION(LAMBDA W; ISPATH(W,Y,X.SEEN,G)));
00900	
01000	ORLIS(U,FN) ← NOT NULL U AND (FN CAR U OR ORLIS(CDR U,FN));
01100	
01200	COMMENT THIS IS A NOT VERY INTERESTING GRAPH;
01300	GR ← '((A B D) (B A D E C) (C B F) (D A B E) (E D B F) (F C E));
01400	
01500	SUBT(U,V) ← IF NULL U THEN NIL ELSE IF CAR U MEMBER V THEN SUBT(CDR U,V)
01600				ELSE CAR U . SUBT(CDR U,V);
01700	
01800	COMMENT DISTANCE(X,Y,G) IS THE DISTANCE FROM VERTEX  X  TO VERTEX  Y
01900	IN THE GRAPH  G.  ITS AUXILIARY FUNCTIONS ARE  DISTA, FIXUP.  IT IS
02000	ASSUMED THAT  Y  IS ACCESSIBLE FROM  X  IN  G.;
02100	
02200	DISTANCE(X,Y,G) ← DISTA(NIL,LIST X,NIL,Y,G);
02300	
02400	
02500	DISTA(DEAD,LIVE,NEWS,Y,G) ←
02600		IF NULL LIVE THEN
02700			(LAMBDA W; IF NULL W THEN NIL
02800					ELSE (LAMBDA Z; IF NULL Z THEN NIL
02900							ELSE 1+Z)
03000							DISTA(DEAD,W,NIL,Y,G))
03100			FIXUP(NEWS,DEAD)
03200		ELSE IF CAR LIVE EQ Y THEN 0
03300		ELSE DISTA(CAR LIVE.DEAD,CDR LIVE,CDR ASSOC(CAR LIVE,G).
03400	NEWS, Y,G);
03500	
03600	FIXUP(NEWS,DEAD) ← IF NULL NEWS THEN NIL 
03700			 ELSE(LAMBDA W; APPEND(SUBT(SUBT(CAR NEWS,DEAD),W),W))
03800				FIXUP(CDR NEWS,DEAD);
03900	
04000	
04100	COMMENT ISACCESSIBLE(X,Y,G)  TELLS IF THE VERTEX  Y  IS ACCESSIBLE
04200	FROM THE VERTEX  X  IN THE GRAPH  G.;
04300	
04400	ISACCESSIBLE(X,Y,G) ← ISACCESSA(NIL,NIL,LIST LIST X,Y,G);
04500	
04600	ISACCESSA(DEAD,LIVE,NEWS,Y,G) ←
04700		IF NULL LIVE THEN
04800			(LAMBDA W; IF NULL W THEN NIL
04900				   ELSE ISACCESSA(DEAD,W,NIL,Y,G))
05000			FIXUP(NEWS,DEAD)
05100		ELSE IF CAR LIVE EQ Y THEN T
05200		ELSE ISACCESSA(CAR LIVE.DEAD,CDR LIVE,CDR ASSOC(CAR LIVE,G).
05300	NEWS, Y,G);
05400	
05500	PATH(X,Y,G) ← (LAMBDA W; IF CAR W EQ 'NO THEN 'NO ELSE CDR W)
05600			PATHA(LIST X,Y,NIL,G);
05700	
05800	PATHA(U,Y,SEEN,G) ←
05900		IF NULL U THEN 'NO . SEEN
06000		ELSE IF CAR U EQ Y THEN 'YES . LIST Y
06100		ELSE (LAMBDA W; IF CAR W EQ 'NO THEN PATHA(CDR U,Y,CDR W,G)
06200				ELSE 'YES . (CAR U . CDR W))
06300			PATHA(SUBT(CDR ASSOC(CAR U,G),SEEN),Y,CAR U . SEEN,G);
06400	
06500	COMMENT LPATH(X,Y,N,G)  IS A PATH FROM  X  TO  Y  IN  G
06600	OF LENGTH AT MOST  N+1  PROVIDED SUCH A PATH EXISTS.  OTHERWISE, THE
06700	VALUE IS  NO.;
06800	
06900	LPATH(X,Y,N,G) ← LPATHA(LIST X,Y,N,G);
07000	
07100	LPATHA(U,Y,N,G) ←
07200		IF NULL U THEN 'NO
07300		ELSE IF N=-1 THEN 'NO
07400		ELSE IF CAR U EQ Y THEN LIST Y
07500		ELSE (LAMBDA W; IF W EQ 'NO THEN LPATHA(CDR U,Y,N,G)
07600				ELSE CAR U . W)
07700			LPATHA(CDR ASSOC(CAR U,G),Y,N-1,G);